/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.dalc;

import br.com.Enumeradores.PROCEDURES;
import br.com.entities.ClienteBE;
import br.com.utils.UtilsMySQL;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;

/**
 * Camada de persistencia de dados
 *
 * @author Kevlin Toshinari Ossada - 30/01/2013 - kevlin.ossada@fatec.sp.gov.br
 */
public class ClienteDALC {

    private static ClienteDALC instance;

    /**
     * Padrão singleton
     *
     * @return Classe
     *
     * @author Kevlin Toshinari Ossada - 30/01/2013 -
     * kevlin.ossada@fatec.sp.gov.br
     */
    public static ClienteDALC getInstance() {
        if (instance == null) {
            instance = new ClienteDALC();
        }
        return instance;
    }

    /**
     * Insere cliente no banco de dados
     *
     * @param oCliente Cliente a ser inserido
     * @return retorna sucesso ou erro
     *
     * @author Kevlin Toshinari Ossada - 30/01/2013 -
     * kevlin.ossada@fatec.sp.gov.br
     */
    public Boolean inserirCliente(ClienteBE oCliente) {
        boolean sucesso = false;
        try {
            try (CallableStatement stm = UtilsMySQL.getProcStatement(PROCEDURES.SP_INSERIR_CLIENTE)) {
                stm.setInt(1, oCliente.getCodigoCliente());
                stm.setInt(2, oCliente.getCpfCliente());
                stm.setString(3, oCliente.getNomeCliente());
                stm.setString(4, oCliente.getEnderecoCliente());
                stm.setString(5, oCliente.getBairroCliente());
                stm.setString(6, oCliente.getCidadeCliente());
                stm.setString(7, oCliente.getTelefoneCliente());
                stm.setString(8, oCliente.getRgCliente());

                stm.execute();

                sucesso = true;
            }



        } catch (Exception ex) {
            System.out.println(new StringBuilder().append("\nErro: ").append(ex.getMessage()).toString());
            sucesso = false;
        } finally {
            UtilsMySQL.fecharConexao();
        }
        return sucesso;
    }

    /**
     * Altera cliente no banco de dados
     *
     * @param oCliente Cliente a ser alterado
     * @return retorna sucesso ou erro
     *
     * @author Kevlin Toshinari Ossada - 31/01/2013 -
     * kevlin.ossada@fatec.sp.gov.br
     */
    public Boolean alterarCliente(ClienteBE oCliente) {
        Boolean sucesso = false;
        try {
            CallableStatement stm = UtilsMySQL.getProcStatement(PROCEDURES.SP_ALTERAR_CLIENTE);

            stm.setInt(1, oCliente.getCpfCliente());
            stm.setString(2, oCliente.getNomeCliente());
            stm.setString(3, oCliente.getEnderecoCliente());
            stm.setString(4, oCliente.getBairroCliente());
            stm.setString(5, oCliente.getCidadeCliente());
            stm.setString(6, oCliente.getTelefoneCliente());
            stm.setString(7, oCliente.getRgCliente());
            stm.setInt(8, oCliente.getCodigoCliente());
            stm.execute();
            stm.close();
            sucesso = true;

        } catch (Exception ex) {
            System.out.println(new StringBuilder().append("\nErro: ").append(ex.getMessage()).toString());
            sucesso = false;
        } finally {
            UtilsMySQL.fecharConexao();
        }
        return sucesso;
    }

    /**
     * Deleta cliente no banco de dados
     *
     * @param oCliente Cliente a ser deletado
     * @return retorna sucesso ou erro
     *
     * @author Kevlin Toshinari Ossada - 31/01/2013 -
     * kevlin.ossada@fatec.sp.gov.br
     */
    public Boolean deletarCliente(ClienteBE oCliente) {
        Boolean sucesso = false;
        try {
            CallableStatement stm = UtilsMySQL.getProcStatement(PROCEDURES.SP_DELETAR_CLIENTE);
            stm.setInt(1, oCliente.getCodigoCliente());
            stm.execute();
            stm.close();
            sucesso = true;
        } catch (Exception ex) {
            System.out.println(new StringBuilder().append("\nErro no deletarCliente()!\n").append(ex.getMessage()));
            sucesso = false;
        } finally {
            UtilsMySQL.fecharConexao();
        }
        return sucesso;

    }

    /**
     * Pega ultimo Id que foi inserido na tabela
     *
     * @return Ultimo id
     *
     * @author Kevlin Toshinari Ossada - 30/01/2013 -
     * kevlin.ossada@fatec.sp.gov.br
     */
    public int getLastId() {
        int lastId;
        try {
            CallableStatement stm = UtilsMySQL.getProcStatement(PROCEDURES.SP_GETLASTID_CLIENTE);
            try (ResultSet rs = stm.executeQuery()) {
                rs.next();
                lastId = rs.getInt("lastID");
            }
            stm.close();
        } catch (Exception ex) {
            System.out.println("\nErro no  getLastId()! Erro: " + ex.getMessage());

            lastId = 0;
        } finally {
            UtilsMySQL.fecharConexao();
        }
        return lastId;
    }

    /**
     * Busca todos os clientes cadastrados na tabela
     *
     * @return Lista de clientes cadastrados
     *
     * @author Kevlin Toshinari Ossada - 30/01/2013 -
     * kevlin.ossada@fatec.sp.gov.br
     */
    public ArrayList<ClienteBE> listarTodosClientes() {
        Boolean sucesso = false;
        ArrayList<ClienteBE> lstClientes = new ArrayList<>();
        try {
            //String sql = ("{ call sp_listar_cliente() };");

            CallableStatement stm = UtilsMySQL.getProcStatement(PROCEDURES.SP_LISTAR_CLIENTES);
            
            ResultSet rs = stm.executeQuery();
            
            while (rs.next()) {
                lstClientes.add(new ClienteBE(
                        rs.getInt("id_cliente"),
                        rs.getInt("cpf_cliente"),
                        rs.getString("nome_cliente"),
                        rs.getString("endereco_cliente"),
                        rs.getString("bairro_cliente"),
                        rs.getString("cidade_cliente"),
                        rs.getString("telefone_cliente"),
                        rs.getString("rg_cliente")));
            }
        } catch (Exception ex) {
            System.out.println("\nErro no listarTodosClientes()! Erro: " + ex.getMessage());
        } finally {
            UtilsMySQL.fecharConexao();
        }
        return lstClientes;
    }
}
